---
title: "01-迁移"
created: 2026-01-15
tags:
- 博客
---
# 迁移
## 第一阶段:旧服务器(数据打包)
写好了备份脚本,迁移就非常简单了。
#### 1. 执行 Docker 备份脚本
`/opt/backup_docker.sh` 是迁移神器
```bash
# 手动运行一次备份,确保是最新的数据
sudo /opt/backup_docker.sh
```
Bash
```bash
# 手动运行一次备份,确保是最新的数据
sudo /opt/backup_docker.sh
```
执行完后, `docker_docker_backup_xxx.tar.gz` 里面已经包含了:
- `/opt/stacks` (Dockge 配置)
- `/opt/dockge` (Dockge 本身)
- `/opt/docker_data` (所有应用的数据:Mysql, Trilium, Nginx, etc.)
#### 2. 备份宿主机的“非 Docker”配置(关键!)
因为 Cloudflared 和 EasyTier 是直接装在系统里的,这些不在上面的备份包里。需要手动记下或备份以下内容:
1. **EasyTier 的启动参数:**
- 需要保留**Network Secret (组网密码)**。
- 需要保留 **虚拟 IP (10.10.10.1)**。
- *操作:* 备份 `/etc/systemd/system/easytier.service` 文件。
```
cp /etc/systemd/system/easytier.service /root/easytier.service.bak
```
2. **Cloudflare Tunnel 的 Token:**
- 虽然在 Cloudflare 后台能看到,但最好把那个 `sudo cloudflared service install eyJ...` 的长命令记在一个记事本里。
3. **看门狗脚本:**
- 别忘了 `/opt/check_tunnel.sh`。
```
cp /opt/check_tunnel.sh /root/
```
4. **打包带走:** 把上面这些零散文件打包,或者直接复制内容到本地笔记里。
## 第二阶段:新服务器(恢复环境)
### 阶段目标
将旧服务器的数据完整迁移至新服务器,并将核心网络层 (EasyTier + Cloudflare) 容器化,实现“解压即用”的快速部署。
---
### 第一步:基础环境初始化
连上新服务器 SSH,执行以下操作。
**1. 更换系统源 (阿里云)**
```
bash <(curl -sSL https://linuxmirrors.cn/main.sh) --source aliyun
```
**2. 安装 Docker** 使用 TUI 界面安装,更稳妥。
```
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
# 安装完成后检查
docker --version
```
**3. 配置 Docker 镜像加速 (关键)** 为了防止拉取镜像超时,配置国内加速源。
```
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.1panel.live",
"https://docker.m.daocloud.io",
"https://docker.1panel.dev",
"https://docker.juewuy.com"
]
}
EOF
systemctl daemon-reload
systemctl restart docker
```
**4. 校准服务器时区 (可选但推荐)**
```bash
sudo timedatectl set-timezone Asia/Shanghai
```
---
### 第二步:数据恢复
**1. 上传备份** 使用 SSH 工具将 `docker_backup_xxxx.tar.gz` 上传至 `/root` 目录。
**2. 解压归位**
```
# -C / 表示解压到根目录,自动还原到 /opt/dockge 等路径
tar -xzf docker_backup_*.tar.gz -C /
# 验证数据是否回来
ls /opt
```
![[7-Blog/网络与自托管/基于 NAT VPS 的全 Docker 化部署方案/assets/image-b0ea5be7.png]]
---
### 第三步:启动管理面板 (Dockge)
数据归位后,先启动面板。
```
cd /opt/dockge
docker compose up -d
```
开启nat转发
![[7-Blog/网络与自托管/基于 NAT VPS 的全 Docker 化部署方案/assets/image-15b7d33e.png]]
访问http://202.189.7.62:20113 进入管理页面
---
### 第四步:部署网络核心 (Network Core)
这是迁移的重头戏,把 EasyTier 和 Cloudflare 跑在 Docker 里。
**1. 创建 Stack**
- Dockge 左上角 -> `+ Compose`
- Name: `network-core`
**2. 粘贴配置**
```
version: "3.8"
services:
# --- EasyTier (组网核心) ---
easytier:
image: easytier/easytier:latest
container_name: easytier
hostname: easytier-vps
restart: always
# 【关键】使用 Host 模式,性能最好,且不需要映射端口
network_mode: host
# VPN 需要网络管理权限
privileged: true
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun
# 启动命令:指定 IP (10.10.10.1) 和 密码
command: -i 10.10.10.1 --network-secret zw200495
# --- Cloudflared (公网入口) ---
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: always
# 【关键】Host 模式,直通本机 localhost:5001
network_mode: host
# ⚠️【请修改】填入 Cloudflare Tunnel Token
command: tunnel run --token <你的Token>
```
**3. 部署与验证**
- 点击 **Deploy**。
- 等待日志出现 `Registered tunnel connection`。
- **验证:** 访问 `https://docker.hxnppll.top`,如果能打开 Dockge,说明公网通了。
---
### 第五步:客户端适配 (Windows)
因为更换了 VPS,NAT 映射的端口变了,需要更新家里电脑的连接信息。
**1. 获取新端口** 在 VPS 后台查看 NAT 转发:内部 `11010` -> 外部 `?????` (例如 35000)。
**2. 修改 Windows EasyTier 配置**
```
[[peer]]
# 修改为新 IP 和新端口
uri = "udp://202.189.7.62:35000"
```
**3. 重启 Windows EasyTier** 并尝试 `ping 10.10.10.1`。
---
### 第六步:复活业务与修正配置 (补漏)
**1. 修正镜像策略** 旧备份的 Stack 可能含有 `pull_policy: never`。在新服务器上会导致启动失败。
- 在 Dockge 中编辑其他 Stacks (如 Nginx, Trilium)。
- **删除** `pull_policy: never` 这一行。
- 点击 **Deploy** (让它自动从新配置的阿里云源拉取镜像)。
**2. 启动所有服务**
- 逐个启动 `filebrowser`, `uptime-kuma` 等所有业务容器。
---
### 第七步:恢复自动化脚本
由于架构变更为 Docker,旧脚本已失效,需重写。
**1. 升级版看门狗 (check\_tunnel.sh)**
```
cat > /opt/check_tunnel.sh <<EOF
#!/bin/bash
TEST_URL="https://docker.hxnppll.top"
LOG_FILE="/var/log/tunnel_watchdog.log"
NOW=\$(date +"%Y-%m-%d %H:%M:%S")
HTTP_CODE=\$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "\$TEST_URL")
if [ "\$HTTP_CODE" == "000" ] || [ "\$HTTP_CODE" == "502" ] || [ "\$HTTP_CODE" == "503" ] || [ "\$HTTP_CODE" == "530" ]; then
echo "[\$NOW] ⚠️ 故障 (代码: \$HTTP_CODE),重启 Cloudflared 容器..." >> \$LOG_FILE
# 重启 Docker 容器
docker restart cloudflared
else
:
fi
EOF
chmod +x /opt/check_tunnel.sh
```
**2. 恢复备份脚本 (backup\_docker.sh)**
```
cat > /opt/backup_docker.sh <<EOF
#!/bin/bash
BACKUP_DIR="/opt/backup"
DATE=\$(date +%Y%m%d)
FILENAME="docker_backup_\$DATE.tar.gz"
mkdir -p \$BACKUP_DIR
echo "[\$(date)] 开始备份..."
tar -czf \$BACKUP_DIR/\$FILENAME /opt/stacks /opt/dockge /opt/docker_data
echo "[\$(date)] 备份完成: \$FILENAME"
# 清理 7 天前旧备份
find \$BACKUP_DIR -name "docker_backup_*.tar.gz" -mtime +7 -exec rm {} \;
EOF
chmod +x /opt/backup_docker.sh
```
**3. 写入定时任务**
```
crontab -e
```
添加:
```
*/5 * * * * /opt/check_tunnel.sh
0 3 * * * /opt/backup_docker.sh
0 4 * * 0 docker system prune -af --volumes > /dev/null 2>&1
```
---
**🎉 迁移完成!**